package cn.lishiyuan.algorithm.graph;


/**
 * 图
 * @param <V>
 */
public interface Graph<V> extends GraphSearch<V>,GraphPath<V>{

    /**
     * 图类型
     */
    enum GraphType{
        // 无向图
        GRAPH,
        // 有向图
        DIGRAPH,
    }


    /**
     * 添加一条边
     * @param from
     * @param to
     * @param weight
     */
    void addEdge(V from, V to, int weight);

    /**
     * 添加一条边
     * @param from
     * @param to
     */
    void addEdge(V from, V to);

    /**
     * 移除一条边
     * @param from
     * @param to
     */
    void removeEdge(V from, V to);

    /**
     * 获取从from到to的边的权重
     * @param from
     * @param to
     * @return
     */
    int getWeight(V from, V to);

    /**
     * 检查边是否存在
     * @param from
     * @param to
     * @return
     */
    boolean existsEdge(V from, V to);

    /**
     * 顶点的入度
     * @param vertex
     * @return
     */
    int getInDegree(V vertex);

    /**
     * 顶点的出度
     * @param vertex
     * @return
     */
    int getOutDegree(V vertex);

    /**
     * 获取顶点的数量
     * @return
     */
    int getVertexCount();

    /**
     * 获取边的数量
     * @return
     */
    int getEdgeCount();

}
